import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

/// 用户认证服务
/// 
/// 负责管理用户登录状态、Token存储和刷新、401登录失效处理
/// 使用单例模式确保全局只有一个实例
class AuthService extends ChangeNotifier {
  // 单例实例
  static final AuthService _instance = AuthService._internal();
  
  // 工厂构造函数
  factory AuthService() => _instance;
  
  // 内部构造函数
  AuthService._internal();
  
  // 用户信息
  Map<String, dynamic>? _userInfo;
  
  // 访问令牌
  String? _token;
  
  // 登录状态
  bool _isLoggedIn = false;
  
  // 登录状态流控制器
  final _authStateController = StreamController<bool>.broadcast();
  
  // 获取用户信息
  Map<String, dynamic>? get userInfo => _userInfo;
  
  // 获取令牌
  String? get token => _token;
  
  // 获取登录状态
  bool get isLoggedIn => _isLoggedIn;
  
  // 获取登录状态流
  Stream<bool> get authStateStream => _authStateController.stream;
  
  /// 初始化认证服务
  /// 
  /// 从本地存储加载用户信息和令牌
  Future<void> init() async {
    try {
      final prefs = await SharedPreferences.getInstance();
      final userInfoString = prefs.getString('user_info');
      final tokenString = prefs.getString('token');
      
      if (userInfoString != null && tokenString != null) {
        _userInfo = jsonDecode(userInfoString);
        _token = tokenString;
        _isLoggedIn = true;
        _authStateController.add(true);
      }
    } catch (e) {
      debugPrint('初始化认证服务失败: $e');
      // 初始化失败时清除可能损坏的数据
      await logout();
    }
  }
  
  /// 用户登录
  /// 
  /// [phone] 手机号
  /// [password] 密码
  /// 返回登录是否成功
  Future<bool> login(String phone, String password) async {
    try {
      // TODO: 实际项目中这里应该调用后端API进行身份验证
      // 模拟网络请求延迟
      await Future.delayed(const Duration(seconds: 1));
      
      // 模拟登录成功的响应数据
      final mockResponse = {
        'code': 200,
        'data': {
          'token': 'mock_token_${DateTime.now().millisecondsSinceEpoch}',
          'user': {
            'id': '1001',
            'name': '妙护士',
            'phone': phone,
            'avatar': 'https://example.com/avatar.png',
            'department': '心血管内科二病区',
            'role': 'nurse',
          }
        }
      };
      
      // 检查登录是否成功
      if (mockResponse['code'] == 200) {
        final data = mockResponse['data'] as Map<String, dynamic>;
        _token = data['token'] as String;
        _userInfo = data['user'] as Map<String, dynamic>;
        _isLoggedIn = true;
        
        // 保存到本地存储
        final prefs = await SharedPreferences.getInstance();
        await prefs.setString('user_info', jsonEncode(_userInfo));
        await prefs.setString('token', _token!);
        
        // 通知监听器登录状态变化
        _authStateController.add(true);
        notifyListeners();
        return true;
      } else {
        return false;
      }
    } catch (e) {
      debugPrint('登录失败: $e');
      return false;
    }
  }
  
  /// 用户登出
  /// 
  /// 清除本地存储的用户信息和令牌
  Future<void> logout() async {
    try {
      _userInfo = null;
      _token = null;
      _isLoggedIn = false;
      
      // 清除本地存储
      final prefs = await SharedPreferences.getInstance();
      await prefs.remove('user_info');
      await prefs.remove('token');
      
      // 通知监听器登录状态变化
      _authStateController.add(false);
      notifyListeners();
    } catch (e) {
      debugPrint('登出失败: $e');
    }
  }
  
  /// 处理401未授权错误
  /// 
  /// 当API请求返回401错误时调用此方法
  /// 清除登录状态并通知应用程序重新登录
  Future<void> handleUnauthorized() async {
    await logout();
    // 可以在这里添加导航到登录页面的逻辑，或者通过流通知应用程序
  }
  
  /// 销毁服务
  @override
  void dispose() {
    _authStateController.close();
    super.dispose();
  }
}